home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 1
/
Cream of the Crop 1.iso
/
MONITOR
/
FACETS.ARJ
/
FACETS.BAS
next >
Wrap
BASIC Source File
|
1991-04-27
|
5KB
|
173 lines
DECLARE SUB DrawPoly (A, B, C, D, E, F, G AS SINGLE)
XC = 160: YC = 100' SCREEN CENTER COORDINATES
Outline = 0
OutlineColor = 62
Wireframe = 0
VN = 32: DIM P(VN - 1, 2)' NUMBER OF VERTICIES
FA = 60: DIM F(FA / 2, 2), SH(FA / 2), Z(FA / 2), K(FA / 2)' NUMBER OF FACETS
CLS
PRINT "SMALL STELLATED DODECAHEDRON"
PRINT : PRINT
PRINT "SELECT STYLE FOR DRAWING:": PRINT
PRINT " (N). NORMAL"
PRINT " (E). EMPHESIZE THE EDGES"
PRINT " (W). WIRE FRAME WITH HIDDEN LINES REMOVED"
PRINT : INPUT "YOUR CHOICE"; A$
IF A$ = "W" THEN Wireframe = 1
IF A$ = "E" THEN Outline = 1
PRINT
PRINT "READING VERTEX DATA"
PRINT
FOR N = 0 TO VN - 1
READ P(N, 0), P(N, 1), P(N, 2)
NEXT N
PRINT "ENTER X, Y, AND Z ANGLES OF ROTATION."
INPUT X, Y, Z
J = 3.14159265# / 180: X = X * J: Y = Y * J: Z = Z * J
X0 = COS(Y) * COS(Z) - SIN(X) * SIN(Y) * SIN(Z)
X1 = COS(Y) * SIN(Z) + SIN(X) * SIN(Y) * COS(Z)
X2 = -COS(X) * SIN(Y)
Y0 = -COS(X) * SIN(Z): Y1 = COS(X) * COS(Z): Y2 = SIN(X)
Z0 = SIN(Y) * COS(Z) + SIN(X) * COS(Y) * SIN(Z)
Z1 = SIN(Y) * SIN(Z) - SIN(X) * COS(Y) * COS(Z): Z2 = COS(X) * COS(Y)
PRINT
PRINT "PREFORMING ROTATION"
FOR N = 0 TO VN - 1
X = P(N, 0): Y = P(N, 1): Z = P(N, 2)
P(N, 0) = X0 * X + X1 * Y + X2 * Z
P(N, 1) = Y0 * X + Y1 * Y + Y2 * Z
P(N, 2) = Z0 * X + Z1 * Y + Z2 * Z
NEXT N
PRINT "READING CONNECTION DATA"
VF = -1' VF = # VISIBLE FACETS
FOR N = 1 TO FA
VF = VF + 1
FOR I = 0 TO 2
READ F(VF, I)
NEXT I
Z = (P(F(VF, 2), 0) - P(F(VF, 1), 0)) * (P(F(VF, 0), 1) - P(F(VF, 1), 1))
Z = Z - (P(F(VF, 0), 0) - P(F(VF, 1), 0)) * (P(F(VF, 2), 1) - P(F(VF, 1), 1))
IF Z > 0 THEN
X = (P(F(VF, 2), 1) - P(F(VF, 1), 1)) * (P(F(VF, 0), 2) - P(F(VF, 1), 2))
X = X - (P(F(VF, 0), 1) - P(F(VF, 1), 1)) * (P(F(VF, 2), 2) - P(F(VF, 1), 2))
Y = (P(F(VF, 2), 2) - P(F(VF, 1), 2)) * (P(F(VF, 0), 0) - P(F(VF, 1), 0))
Y = Y - (P(F(VF, 0), 2) - P(F(VF, 1), 2)) * (P(F(VF, 2), 0) - P(F(VF, 1), 0))
NC = SQR(X * X + Y * Y + Z * Z)
SH(VF) = 26 * (2 * Z + X + Y) / NC
SH(VF) = (SH(VF) + 64) * (SH(VF) + 64) / 256
ELSE VF = VF - 1
END IF
NEXT N
PRINT "SCALING TO DISPLAY SIZE"
Y = 0
FOR N = 0 TO VN - 1
IF ABS(P(N, 1)) > Y THEN Y = ABS(P(N, 1))
NEXT N
S = 100 / Y
FOR N = 0 TO VN - 1
P(N, 1) = S * P(N, 1) + YC: P(N, 0) = S * P(N, 0) + XC
NEXT N
FOR N = 0 TO VF
Z(N) = (P(F(N, 0), 2) + P(F(N, 1), 2) + P(F(N, 2), 2)) / 3
NEXT N
PRINT "SORTING FACETS ACCORDING TO AVERAGE 'Z'"
FOR I = 0 TO VF
V = 1
FOR J = 0 TO VF
IF Z(J) < Z(V) AND Z(J) <> 1000 THEN V = J
NEXT J
K(I) = V
Z(V) = 1000
NEXT I
SCREEN 13
FOR I = 1 TO 63
PALETTE I, (65536 * (32 + INT(I / 2))) + (256 * I) + I
NEXT I
PALETTE 14, 63
FOR N = 0 TO VF
FA = K(N)
CO = SH(FA)
IF CO > 62 THEN CO = 62
IF Wireframe THEN CO = 0
X0 = P(F(FA, 0), 0): Y0 = P(F(FA, 0), 1)
X1 = P(F(FA, 1), 0): Y1 = P(F(FA, 1), 1)
X2 = P(F(FA, 2), 0): Y2 = P(F(FA, 2), 1)
CALL DrawPoly(X0, Y0, X1, Y1, X2, Y2, CO)
NEXT N
DO
LOOP UNTIL INKEY$ > ""
' VERTEX DATA
DATA 1000,618,0, 1000,-618,0, -1000,618,0, -1000,-618,0
DATA 0,1000,618, 0,1000,-618, 0,-1000,618, 0,-1000,-618
DATA 618,0,1000, -618,0,1000, 618,0,-1000, -618,0,-1000
DATA 618,0,236, 618,0,-236, -618,0,236, -618,0,-236
DATA 236,618,0, -236,618,0, 236,-618,0, -236,-618,0
DATA 0,236,618, 0,-236,618, 0,236,-618, 0,-236,-618
DATA 382,382,382,382,382,-382,382,-382,382,382,-382,-382
DATA -382,382,382,-382,382,-382,-382,-382,382,-382,-382,-382
' CONNECTION DATA
DATA 0,12,13, 0,13,25, 0,25,16, 0,16,24, 0,24,12
DATA 1,12,26, 1,26,18, 1,18,27, 1,27,13, 1,13,12
DATA 2,15,14, 2,14,28, 2,28,17, 2,17,29, 2,29,15
DATA 3,14,15, 3,15,31, 3,31,19, 3,19,30, 3,30,14
DATA 4,16,17, 4,17,28, 4,28,20, 4,20,24, 4,24,16
DATA 5,17,16, 5,16,25, 5,25,22, 5,22,29, 5,29,17
DATA 6,19,18, 6,18,26, 6,26,21, 6,21,30, 6,30,19
DATA 7,18,19, 7,19,31, 7,31,23, 7,23,27, 7,27,18
DATA 8,20,21, 8,21,26, 8,26,12, 8,12,24, 8,24,20
DATA 9,21,20, 9,20,28, 9,28,14, 9,14,30, 9,30,21
DATA 10,23,22, 10,22,25, 10,25,13, 10,13,27, 10,27,23
DATA 11,22,23, 11,23,31, 11,31,15, 11,15,29, 11,29,22
SUB DrawPoly (A, B, C, D, E, F, G AS SINGLE)
SHARED Outline, OutlineColor, Wireframe
DIM X(3), Y(3)
X(1) = A: X(2) = C: X(3) = E
Y(1) = B: Y(2) = D: Y(3) = F
LINE (A, B)-(C, D), 63
LINE -(E, F), 63
LINE -(A, B), 63
X1 = (A + C) / 2: X2 = (C + E) / 2: X3 = (E + A) / 2
Y1 = (B + D) / 2: Y2 = (D + F) / 2: Y3 = (F + B) / 2
X = (X1 + X2 + X3) / 3: Y = (Y1 + Y2 + Y3) / 3
IF C - A <> 0 AND E - A <> 0 THEN
S1 = (D - B) / (C - A)
S2 = (F - B) / (E - A)
GOTO 2
END IF
IF C - A <> 0 AND E - C <> 0 THEN
S1 = (D - B) / (C - A)
S2 = (F - D) / (E - C)
END IF
2 IF ABS(S1 - S2) > .01 OR (S1 = 0 AND S2 = 0) THEN
PAINT (X, Y), 1, 63
PAINT (X, Y), G, 63
END IF
IF Outline THEN CC = OutlineColor ELSE CC = G
IF Wireframe THEN CC = OutlineColor
LINE (A, B)-(C, D), CC
LINE -(E, F), CC
LINE -(A, B), CC
END SUB